Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

293
Visualizações
¿Por qué recibo un error de "valor requerido como unario y operando"?

Estoy trabajando en una función que inserta un valor en un árbol de búsqueda binario, escribí este código:

 // this is my decalarations if its relevent typedef struct element* tree; typedef struct element { type data; tree right; tree left; } noed; tree rightSon(tree head) { return (head->right); } void insert(tree* a,int val) { if(!empty(*a)) { if((*a)->data>val) { if(!empty(leftSon(*a))) insert(&leftSon(*a),val); // error here leftson return a tree else { (*a)->left=newNoed(val); } } else if((*a)->data<val) { if(!empty(rightSon(*a))) insert(&rightSon(*a),val); //same error here else (*a)->right=newNoed(val); } else printf("value already exist!\n"); } else { *a=newNoed(val); } }

Resolví el problema declarando variables locales de tipo tree y luego asignándoles los valores de esta manera:

 tree lson; lson=leftson(*a); insert(&lson,val);

Pero todavía no entiendo cuál era el problema en primer lugar.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Parece que la función leftSon (y rightSon ) tiene el tipo de retorno tree . Es decir, devuelve un objeto temporal. No puede aplicar el operador & a un objeto temporal como en esta declaración

 insert(&leftSon(*a),val);

Podrías escribir el código sin llamar a las funciones hijo izquierdo o hijo derecho como

 if(!empty(rightSon(*a))) insert( &(*a)->right ,val);

De hecho, las declaraciones if-else como esta

 if(!empty(leftSon(*a))) insert(&leftSon(*a),val); // error here leftson return a tree else { (*a)->left=newNoed(val); }

son redundantes. En lugar de ellos, podrías escribir

 insert( &(*a)->left, val );

y

 insert( &(*a)->right, val );
over 4 years ago · Santiago Trujillo Relatório

0

Su función rightSon está devolviendo el valor del objeto puntero almacenado en head->right . No puede tomar la dirección de un valor.

En cambio, lo que desea hacer es hacer que rightSon devuelva la dirección de head->right , que luego se puede pasar directamente a insert .

Así que cambie rightSon para devolver la dirección:

 tree *rightSon(tree head) { return &head->right; }

Y llámalo así:

 insert(rightSon(*a),val);

presumiblemente, leftSon tiene el mismo problema, así que haga un cambio similar para eso.

Además, ocultar un puntero detrás de una typedef de tipo se considera una mala práctica, ya que ya no es obvio con solo mirar el código que una variable de ese tipo es un puntero y puede causar confusión al lector.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda